<?php
/**
 * @link https://gitee.com/toshcn/micro-hau
 * @copyright Copyright (c) 2022/4/20 micro-hau
 * @author toshcn <toshcn@foxmail.com>
 */

namespace api\controllers;

use yii\rest\Controller;
use yii\filters\Cors;
use yii\helpers\ArrayHelper;

/**
 * API 项目基类控制器 api项目所有接口控制器都要继承此类
 * Class ApiController
 * @package api\controllers
 */
class ApiController extends Controller
{
    const ERROR_CODE_NOT_POST = 4405; // 接口错误码 不是POST请求
    const ERROR_CODE_FORM_FIELD_ERROR = 4001; // 接口错误码 表单字段错误
    const ERROR_CODE_FORM_ERROR = 5000; // 接口错误码 服务器出错 表单保存出错

    /**
     * 配置控制器行为
     * @return array
     */
    public function behaviors()
    {
        $behaviors = ArrayHelper::merge([
            'corsFilter' => [
                'class' => Cors::class,
                'cors' => [
                    'Origin' => ['*'], // 跨域配置 *允许全部域名
                    // 可过滤请求的动作类型 如: 可配置只允许POST和GET
                    'Access-Control-Request-Methods' => ['POST', 'PUT', 'GET', 'OPTIONS'],
                    'Access-Control-Request-Headers' => ['*']
                ]
            ]
        ], parent::behaviors());
        // 是否在HTTP头带上目前的速率限制信息
        $behaviors['rateLimiter']['enableRateLimitHeaders'] = false;
        return $behaviors;
    }

    /**
     * 重载请求动作方法前
     * 可在此处做一些代码检查，比如网站是否关闭，用户是否登录
     * @param mixed $action 当前请求的动作
     * @return bool
     * @throws \yii\web\BadRequestHttpException
     */
    public function beforeAction($action)
    {
        $res = parent::beforeAction($action);

        // 检测网站是否关闭
        // todo
        return $res;
    }

    /**
     * 检测post请求
     * 如果非post请求，发送4405代码
     * @return mixed
     */
    public function validateIsPost()
    {
        if (!\Yii::$app->getRequest()->getIsPost()) {
            $response = \Yii::$app->getResponse();
            $response->data = \Yii::$app->api->error(static::ERROR_CODE_NOT_POST, \Yii::t('common', 'The request is not in a post way.'));
            $response->send();
        }
        return true;
    }
}
